#!/usr/bin/env python3
import sys
import os
import subprocess
import shutil
from typing import Optional, Tuple

def get_selected_text() -> Optional[str]:
    """获取选中的文本"""
    # 方式1: 从标准输入读取（qutebrowser的主要方式）
    if not sys.stdin.isatty():
        selected_text = sys.stdin.read().strip()
        if selected_text:
            return selected_text
    
    # 方式2: 从命令行参数读取
    if len(sys.argv) > 1:
        return ' '.join(sys.argv[1:]).strip()
    
    # 方式3: 从环境变量读取
    selected_text = os.environ.get('QUTE_SELECTED_TEXT', '').strip()
    if selected_text:
        return selected_text
    
    # 方式4: 使用xclip获取系统剪贴板（备用方案）
    try:
        result = subprocess.run(['xclip', '-selection', 'primary', '-o'], 
                              capture_output=True, text=True, timeout=2)
        if result.returncode == 0 and result.stdout.strip():
            return result.stdout.strip()
    except (FileNotFoundError, subprocess.TimeoutExpired):
        pass
    
    return None

def check_kd_available() -> bool:
    """检查kd命令是否可用"""
    return shutil.which('kd') is not None

def translate_with_kd(text: str) -> Tuple[bool, str]:
    """使用kd命令进行翻译"""
    try:
        # 执行kd -t命令进行翻译
        result = subprocess.run(
            ['kd', '-t', text],
            capture_output=True,
            text=True,
            timeout=10,  # 设置超时时间
            check=False  # 不抛出异常，我们自己处理
        )
        
        if result.returncode == 0:
            # 成功翻译
            translation = result.stdout.strip()
            if translation:
                return True, translation
            else:
                return False, "kd命令返回空结果"
        else:
            # kd命令执行失败
            error_msg = result.stderr.strip() or f"退出码: {result.returncode}"
            return False, f"kd命令错误: {error_msg}"
            
    except subprocess.TimeoutExpired:
        return False, "翻译超时"
    except FileNotFoundError:
        return False, "kd命令未找到"
    except Exception as e:
        return False, f"执行kd命令时发生错误: {str(e)}"

def send_notification(title: str, message: str, urgent: bool = False):
    """发送桌面通知"""
    try:
        cmd = ['notify-send', title, message, '-t', '5000']
        if urgent:
            cmd.extend(['-u', 'critical'])
        subprocess.run(cmd, check=False, timeout=5)
    except subprocess.TimeoutExpired:
        pass

def main():
    # 首先检查kd命令是否可用
    if not check_kd_available():
        send_notification("翻译错误", "kd命令未安装或不在PATH中", True)
        print("错误: kd命令未找到，请确保已安装kd工具", file=sys.stderr)
        sys.exit(1)
    
    # 获取选中的文本
    selected_text = get_selected_text()
    
    if not selected_text:
        send_notification("翻译错误", "请先选择要翻译的文本", True)
        sys.exit(1)
    
    print(f"正在使用kd翻译: {selected_text}", file=sys.stderr)
    
    # 使用kd命令进行翻译
    success, result = translate_with_kd(selected_text)
    
    if not success:
        send_notification("翻译失败", f"{result}\n文本: {selected_text}", True)
        sys.exit(1)
    
    # 显示翻译结果
   # notification_msg = f"原文: {selected_text}\n译文: {result}"
    notification_msg = f"译文: {result}"
    send_notification("kd翻译结果", notification_msg)
    
    # 同时在终端输出
  #  print(f"翻译完成: {selected_text} -> {result}")
  #  sys.exit(0)

if __name__ == "__main__":
    main()
